package com.larly.manager.upload;

import cn.hutool.core.io.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * COS图片上传服务类
 * 负责处理文件上传至腾讯云对象存储的相关逻辑
 */
@Service
@Slf4j
public class UploadFile {

    @Resource
    private CosManager cosManager;

    @Value("${cos.client.host}")
    private String host;

    // 支持的图片类型
    private static final List<String> SUPPORTED_IMAGE_TYPES = Arrays.asList(
            "jpg", "jpeg", "png", "gif", "bmp", "webp"
    );

    /**
     * 校验图片文件的合法性
     * @param file 待校验的文件
     */
    private void validFile(File file) {
        // 检查文件是否存在
        if (file == null || !file.exists()) {
            throw new IllegalArgumentException("文件不存在");
        }

        // 检查是否为文件（而不是目录）
        if (!file.isFile()) {
            throw new IllegalArgumentException("上传的必须是文件");
        }

        // 检查文件大小（限制为10MB）
        long maxSize = 10 * 1024 * 1024; // 10MB
        if (file.length() > maxSize) {
            throw new IllegalArgumentException("文件大小不能超过10MB");
        }

        // 校验文件真实类型（通过文件内容）
        String fileType = FileUtil.getType(file);
        if (!SUPPORTED_IMAGE_TYPES.contains(fileType)) {
            throw new IllegalArgumentException("不支持的文件类型，仅支持图片格式: " + SUPPORTED_IMAGE_TYPES);
        }
    }

    /**
     * 上传文件到COS
     * @param multipartFile 前端上传的文件
     * @param key 文件在COS中的存储路径/名称
     * @return 上传是否成功
     */
    public boolean uploadFile(MultipartFile multipartFile, String key) {
        // 校验上传文件是否为空
        if (multipartFile == null || multipartFile.isEmpty()) {
            throw new IllegalArgumentException("上传文件不能为空");
        }

        // 校验key是否有效
        if (key == null || key.trim().isEmpty()) {
            throw new IllegalArgumentException("存储键(key)不能为空");
        }

        File tempFile = null;
        try {
            // 创建临时文件
            tempFile = File.createTempFile("upload_", null);
            multipartFile.transferTo(tempFile);

            // 校验文件合法性
            validFile(tempFile);

            // 上传到COS
            cosManager.putObject(key, tempFile);
            log.info("文件上传成功，存储键: {}", key);
            return true;
        } catch (IOException e) {
            log.error("文件转换为临时文件失败", e);
            throw new RuntimeException("文件处理失败", e);
        } catch (Exception e) {
            log.error("文件上传到COS失败，存储键: {}", key, e);
            return false;
        } finally {
            // 清理临时文件
            if (tempFile != null && tempFile.exists()) {
                boolean deleted = tempFile.delete();
                if (!deleted) {
                    log.warn("临时文件删除失败: {}", tempFile.getAbsolutePath());
                }
            }
        }
    }

    /**
     * 返回可访问的图片地址
     */
    public String getImgUrl(String key) {
        return host + key;
    }
}
